[CDK]EC2リストを取得して全台にCloudWatchアラームを設定する
コンニチハ、千葉です。
CDK便利ですね。今回はEC2の一覧を取得し、一括でCloudWatchアラームを仕掛けてみたいと思います。具体的には、boto3でEC2の一覧を取得し、対象のEC2に共通のアラームをばんばか設定してみたいと思います。共通の設定する場合に、対象リストを取得して、それを元に設定ができると楽そうですね。
やってみた
今回CDKはPythonを利用します。はじめに、boto3とaws_cdk.aws_cloudwatchをインストールします。
pip install aws_cdk.aws_cloudwatch boto3
EC2の一覧を取得してくる部分のコードです。ここは普通にboto3を使って取得します。
import boto3 client = boto3.client('ec2', 'ap-northeast-1') responce = client.describe_instances() all_list = [] for reservation in responce['Reservations']: for instance in reservation['Instances']: all_list.append(instance['InstanceId']) print(all_list)
取得したEC2リストを元に、CloudWatchアラームをループで設定する処理です。
from aws_cdk import ( aws_cloudwatch as cw, core ) for ec2_id in all_list: metric = cw.Metric( namespace = 'AWS/EC2', metric_name = 'CPUUtilization', dimensions = {"InstanceId": ec2_id} ) alarm = cw.Alarm( self, 'cpu-alarm-' + ec2_id, metric = metric, threshold = 80, evaluation_periods = 2 )
こちらのコードが最終形です。
from aws_cdk import ( aws_cloudwatch as cw, core ) import boto3 class CdkMultiSampleStack(core.Stack): def __init__(self, scope: core.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) # EC2の一覧を取得 client = boto3.client('ec2', 'ap-northeast-1') responce = client.describe_instances() all_list = [] for reservation in responce['Reservations']: for instance in reservation['Instances']: all_list.append(instance['InstanceId']) print(all_list) # アラームを設定 for ec2_id in all_list: metric = cw.Metric( namespace = 'AWS/EC2', metric_name = 'CPUUtilization', dimensions = {"InstanceId": ec2_id} ) alarm = cw.Alarm( self, 'cpu-alarm-' + ec2_id, metric = metric, threshold = 80, evaluation_periods = 2 )``` CloudFormationを出力します。 ```bash cdk synth
デプロイします。
cdk deploy
CloudWatchアラームの設定を見てみます。
EC2を3台起動していたのですが、3台分設定されていました!!
最後に
対象の一覧を取得し、CloudFormationを設定してみました。応用の幅が広く、かなり柔軟に書けました。コード化が捗りますね。 今回のCDKを定期的に実行すると、EC2をばんばかたてても自動で共通のアラームを設定することもできます。可能性無限大です。